package per.ethan.cloud.common.service;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author Ethan
 * @date 2020/04/03 10:06
 */
public interface RedisTemplateService {

    /**
     * 是否存在
     *
     * @param key key
     * @return 是否存在
     */
    boolean exists(String key);

    /**
     * 设置过期
     *
     * @param key        key
     * @param expireTime expireTime
     * @return 是否操作成功
     */
    boolean expire(String key, long expireTime);

    /**
     * 获取过期时间（s）
     *
     * @param key key
     * @return 过期时间
     */
    Long getExpire(String key);

    /**
     * 存值
     *
     * @param key   key
     * @param value value
     * @return 是否操作成功
     */
    boolean set(String key, String value);

    /**
     * 存值
     *
     * @param key        key
     * @param value      value
     * @param expireTime 过期时间,以秒为单位
     * @return 是否操作成功
     */
    boolean set(String key, String value, long expireTime);

    /**
     * 取值
     *
     * @param key key
     * @return 返回值
     */
    Object get(String key);

    /**
     * 删除key
     *
     * @param key key
     * @return 是否成功
     */
    boolean delete(String... key);

    /**
     * 增长
     *
     * @param key     key
     * @param incrNum 要增长多少
     * @return 增长之后的数据
     */
    Long increment(String key, long incrNum);

    /**
     * 增长
     *
     * @param key     key
     * @param incrNum 要增长多少
     * @return 增长之后的数据
     */
    Double increment(String key, Double incrNum);

    /**
     * 减少
     *
     * @param key     key
     * @param decrNum 要减少多少
     * @return 减少之后的数据
     */
    Long decrement(String key, long decrNum);

    /**
     * 减少
     *
     * @param key     key
     * @param decrNum 要减少多少
     * @return 减少之后的数据
     */
    Double decrement(String key, Double decrNum);

    /**
     * 存数据
     *
     * @param key   key
     * @param item  item
     * @param value value
     * @return 是否操作成功
     */
    boolean hSet(String key, String item, String value);

    /**
     * 存数据，并设置过期时间
     *
     * @param key        key
     * @param item       item
     * @param value      value
     * @param expireTime 过期时间
     * @return 是否操作成功
     */
    boolean hSet(String key, String item, Object value, long expireTime);

    /**
     * 获取数据
     *
     * @param key  key
     * @param item item
     * @return 数据
     */
    Object hGet(String key, String item);

    /**
     * 删除hash中的值
     *
     * @param key  key
     * @param item item
     * @return 是否删除成功
     */
    boolean hDelete(String key, Object... item);

    /**
     * 增长
     *
     * @param key     key
     * @param item    item
     * @param incrNum incrNum
     * @return 增长之后的数据
     */
    Long hIncrement(String key, String item, long incrNum);

    /**
     * 增长
     *
     * @param key     key
     * @param item    item
     * @param incrNum incrNum
     * @return 增长之后的数据
     */
    Double hIncrement(String key, String item, Double incrNum);

    /**
     * 减少
     *
     * @param key     key
     * @param item    item
     * @param decrNum decrNum
     * @return 减少之后的数据
     */
    Long hDecrement(String key, String item, long decrNum);

    /**
     * 减少
     *
     * @param key     key
     * @param item    item
     * @param decrNum decrNum
     * @return 减少之后的数据
     */
    Double hDecrement(String key, String item, Double decrNum);


    /**
     * hash表中某一项是否存在值
     *
     * @param key  key
     * @param item item
     * @return hash表中某一项是否存在值
     */
    boolean hashKeyExists(String key, String item);

    /**
     * 哈希添加
     *
     * @param key     key
     * @param hashKey hashKey
     * @param value   value
     * @return 是否操作成功
     */
    boolean hmSet(String key, Object hashKey, Object value);

    /**
     * 哈希添加
     *
     * @param key        key
     * @param hashKey    hashKey
     * @param value      value
     * @param expireTime 过期时间
     * @return 是否操作成功
     */
    boolean hmSet(String key, Object hashKey, Object value, long expireTime);

    /**
     * 哈希添加
     *
     * @param key key
     * @param map map
     * @return 是否操作成功
     */
    boolean hmSet(String key, Map<String, Object> map);

    /**
     * 哈希添加
     *
     * @param key        key
     * @param map        map
     * @param expireTime 过期时间
     * @return 是否操作成功
     */
    boolean hmSet(String key, Map<String, Object> map, long expireTime);

    /**
     * 哈希获取数据
     *
     * @param key key
     * @return 数据
     */
    Map<Object, Object> hmGet(String key);

    /**
     * 存set值
     *
     * @param key    key
     * @param values values
     * @return
     */
    Long sSet(String key, Object... values);

    /**
     * 获取set
     *
     * @param key key
     * @return 数据
     */
    Set<Object> sGet(String key);

    /**
     * set是否存在
     *
     * @param key   key
     * @param value value
     * @return 是否存在
     */
    boolean setExists(String key, Object value);

    /**
     * 存值并设置过期
     *
     * @param key        key
     * @param expireTime 过期时间
     * @param values     values
     * @return
     */
    Long sSet(String key, long expireTime, Object... values);

    /**
     * 获取set长度
     *
     * @param key key
     * @return 长度
     */
    long sSetGetSize(String key);

    /**
     * set删除
     *
     * @param key    key
     * @param values values
     * @return 是否删除成功
     */
    boolean setDelete(String key, Object... values);

    boolean lPush(String key, Object value);

    boolean lPush(String key, Object value, long expireTime);

    boolean lPush(String key, List<Object> list);

    boolean lPush(String key, List<Object> list, long expireTime);

    List<Object> lRange(String key, long start, long end);

    long getListSize(String key);

    Object getListIndex(String key, long index);

    boolean lUpdateIndex(String key, long index, Object value);

    boolean lDelete(String key, long count, Object value);

}
